package lock

import "sync"

//MutexScoreboardManager 如果你需要操作goroutine或跟踪一个值，
//而且它被一系列goroutine使用，则使用通道。
//如果你需要分享对一个结构体中的字段的访问，则使用互斥锁。
//如果你在使用通道时发现了一个关键的性能问题（参见13.4节），
//而又找不到其他方法来解决这个问题，那就修改你的代码，使用互斥锁。
type MutexScoreboardManager struct {
	l          sync.RWMutex
	scoreboard map[string]int
}

func NewMutexScoreboardManager() *MutexScoreboardManager {
	return &MutexScoreboardManager{scoreboard: map[string]int{}}
}

func (m *MutexScoreboardManager) Update(name string, val int) {
	m.l.Lock()
	defer m.l.Unlock()
	m.scoreboard[name] = val
}

func (m *MutexScoreboardManager) read(name string) (int, bool) {
	m.l.RLock()
	defer m.l.RUnlock()

	val, ok := m.scoreboard[name]

	return val, ok
}
